/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package util.www.jdbc;

import java.math.BigDecimal;
import util.usuario.seguridad.PermisosTabla;
import util.www.sql.SentenciaSql;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import util.www.sql.RegistroSql;
import util.www.sql.TipoSentenciaSql;
import util.www.sql.domain.Valor;

/**
 *
 * @author Rdelacruz
 */
public class PreparedStatementSql 
extends SentenciaSql
{    
    
    public PreparedStatementSql(TipoSentenciaSql tipo, RegistroSql registro, PermisosTabla permisos) throws SQLException {        
        super(tipo,registro,permisos);
    }

    
    @Override
    protected String valor(Valor v) {
        return "?";
    }
    
    @Override
    protected void agregarValor(TipoSentenciaSql tipo, Valor v) {
        Class c = v.getClaseValor();
        if(c==Integer.class || c==Boolean.class) {
            //porque setInt y setBoolean de PreparedStatement no aceptan nulos
            if(v.getValor()!=null)
                super.agregarValor(tipo, v);
        }
        else
            super.agregarValor(tipo, v);
    }
    
    
    //Reemplaza los ? del sql por los valores
    public String setearTest(String sql) {
        String sql1 = sql;
        for(Valor v : this.getValores()) {
            Object val = v.getValor();
            Class c = v.getClaseValor();
            
            if(val==null)
                sql1 = sql1.replaceFirst("\\?", "NULL");
            else {            
                if(c==String.class) {
                    sql1 = sql1.replaceFirst("\\?", "'"+(String) val+"'");
                }
                else {                
                    sql1 = sql1.replaceFirst("\\?", val.toString());
                }
            }
        }        
        return sql1;
    }
    
    /**
     * 
     * @param ps
     * @return El número del último parametro seteado
     * @throws SQLException 
     */
    public int setear(PreparedStatement ps) throws SQLException {
        int n = 0;
        for(Valor v : this.getValores()) {
            Object val = v.getValor();
            
            Class c = v.getClaseValor();
            if(c==String.class) {                
                ps.setString(++n, (String) val);
                //System.out.println("n="+n+" String "+v.getColumna());
            }
            else if(c == Integer.class) {                
                ps.setInt(++n, (Integer) val);
                //System.out.println("n="+n+" Integer "+v.getColumna());
            }
            else if(c == Boolean.class) {                
                ps.setBoolean(++n, (Boolean) val);
                //System.out.println("n="+n+" Boolean "+v.getColumna());
            }   
            else if(c == BigDecimal.class) {
                ps.setBigDecimal(++n, (BigDecimal) val);
            } 
        }
        
        
        
        return n;
    }

    
    
}
